package com.twq.types.othertype

import com.twq.GenericTest

/**
 * Created by tangweiqun on 2017/12/7.
 */
object ExistentialTypes {
  def main(args: Array[String]): Unit = {

    val list = GenericTest.makeList() //返回的是res0: java.util.List[_] = []

    //1、其中我们用_来占位类型，告诉编译器，还不确定这边的具体类型是什么，但是确定这边肯定是有类型的

    //2、我们不能向类型为 _ 的list中添加任何新的元素
    //list.add("")

    //3、存在类型可以和upper and lower bound配合一起工作
    def foo(x: List[_ >: Int]) = x

    foo(List("Hi")) //返回res9: List[Any] = List(Hi)，因为Int和String有共同的超类Any

    //4、存在类型的语法
    //T forSome {Q} 其中Q是一个类型定义列表
    val y: List[_] = List() //和下面的是一样的
    val x: List[X forSome {type X}] = y

    //说白了， _ 就是 forSome的一个简单的占位符，但是forSome会更灵活点
    val m: List[_ <: AnyRef] = List()
    val n: List[X forSome {type X <: AnyRef}] = m
  }
}
